package com.wzs.rpc;

import com.wzs.rpc.config.RegistryConfig;
import com.wzs.rpc.constant.RpcConstant;
import com.wzs.rpc.config.RpcConfig;
import com.wzs.rpc.registry.Registry;
import com.wzs.rpc.registry.RegistryFactory;
import com.wzs.rpc.utils.ConfigUtils;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;

@Slf4j
//通过双检索单例模式创建配置单例
public class RpcApplication {
    private static volatile RpcConfig rpcConfig;

    //构造器私有
    private RpcApplication() {
        // 防止反射攻击
        if (rpcConfig!=null) {
            throw new IllegalStateException("单例已存在");
        }
    }

    //获取配置
    public static RpcConfig getRpcConfig() {
        if (rpcConfig==null) {
            synchronized (RpcApplication.class) {
                if (rpcConfig==null) {
                    try {
                        rpcConfig = ConfigUtils.loadConfig(RpcConfig.class, RpcConstant.DEFAULT_CONFIG_PREFIX);
                    } catch (Exception e) {
                        //使用默认配置
                        rpcConfig = new RpcConfig();
                        log.warn("加载配置文件失败, 使用默认配置");
                    }
                }
            }
        }
        return rpcConfig;
    }


//    //初始化注册中心
//    public static void init(@NonNull RpcConfig newRpcConfig) {
//        rpcConfig = newRpcConfig;
//        log.info("rpc init, config = {}", rpcConfig);
//
//        RegistryConfig registryConfig = rpcConfig.getRegistryConfig();
//        Registry registry = RegistryFactory.getInstance(registryConfig.getRegistry());
//        registry.init(registryConfig);
//        log.info("registry init, config = {}", registryConfig);
//    }
}
